package com.niit.agricstore.interceptor;
// 处理请求之后执行
import com.niit.agricstore.util.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.FilterChain;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.util.Enumeration;

public class TokenInterceptor implements HandlerInterceptor {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse
                    response, Object handler) throws Exception {
                if (request.getMethod().equals("OPTIONS"))
                    //跨域资源共享标准新增了一组 HTTP 首部字段，允许服务器声明哪些源站有权限访问哪些资源。
                    // 另外，规范要求，对那些可能对服务器数据产生副作用的 HTTP 请求方法（特别是 GET 以外的 HTTP 请求，或者搭配某些 MIME 类型的 POST 请求），
                    // 浏览器必须首先使用 OPTIONS 方法发起一个预检请求（preflight request），
                    // 从而获知服务端是否允许该跨域请求。服务器确认允许之后，才发起实际的 HTTP 请求。
                    // 在预检请求的返回中，服务器端也可以通知客户端，是否需要携带身份凭证（包括 Cookies 和 HTTP 认证相关数据）。
                    // 参考：https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
                    response.setStatus(HttpServletResponse.SC_OK);

                // 取出请求头中Authorization的信息，就是token内容，接下来就是各种判断
                Enumeration<String> headerNames= request.getHeaderNames();
                while (headerNames.hasMoreElements()) {
                    String headerName = headerNames.nextElement();
                    String headerValue = request.getHeader(headerName);
                    System.out.println("headerName:"+headerName+" headerValue:"+headerValue);
                }

                    String requestToken = request.getHeader("Authorization");
                        System.out.println("Authorization:" + requestToken);
                //存在token
                        if (!StringUtils.isEmpty(requestToken)) {
                //验证token
                            Claims claims = JwtUtils.parseToken(requestToken);

                            boolean flag = JwtUtils.verify(requestToken);
                            System.out.println("flag:=====" + flag);
                //token有效
                            if (flag) {
                //验证是否过期
                // token正确
                                flag = JwtUtils.isTokenExpired(requestToken);
                                if (!flag) {
                                    return true;
                                } else {
                //token已过期
                                    response.setStatus(4101);
                                    return false;
                                }
                            } else {
                // token错误
                // 对应的修改响应头的状态，用于前端判断做出相应的策略
                                response.setStatus(411);
                                return false;
                            }
                        } else {
                // token不存在
                            response.setStatus(4102);
                            return false;
                        }
                    }

                    @Override
                    public void postHandle(HttpServletRequest request, HttpServletResponse
                            response, Object handler, ModelAndView modelAndView) throws Exception {
                        System.out.println("处理请求之后执行");
                    }
}